<!doctype html>
<html lang="en">

<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
  
  <meta name="generator" content="Hugo 0.98.0" />

  
  <meta name="description" content="走在通往幸福的路上">
  

  
  <link rel="apple-touch-icon" sizes="180x180" href="https://blog.v5u.win/apple-touch-icon.png">

  
  <link rel="icon" type="image/png" sizes="32x32" href="https://blog.v5u.win/favicon-32x32.png">

  
  <link rel="icon" type="image/png" sizes="16x16" href="https://blog.v5u.win/favicon-16x16.png">

  
  <link rel="manifest" href="https://blog.v5u.win/site.webmanifest">

  
  <link rel="mask-icon" href="https://blog.v5u.win/safari-pinned-tab.svg" color="">

  <meta name="msapplication-TileColor" content="">

  <meta name="theme-color" content="">

  
  <link rel="stylesheet" href="https://blog.v5u.win/css/bootstrap.min.css" />

  
  <title>Go Crontab v3 | 为吾优</title>
  

  <style>
body {
  min-width: 300px;
}

.custom-navbar {
  margin-bottom: 1em;
  height: 60px;
}

.custom-navbar a {
  display: inline-block; 
  padding: 18px 0;
  margin-right: 1em; 
  font-weight: bold; 
}

.custom-navbar a:hover,
.custom-navbar a:focus {
  text-decoration: none; 
}

@media print {
  .custom-navbar {
    display: none;
  }
}

article {
  padding-bottom: 1em;
}

img {
  max-width: 100%;
}


body {
  background-color: #fff;
}



body {
  color: #212529;
}



a {
  color: #007bff;
}



a:hover,
a:focus {
  color: #0056b3;
}



.custom-navbar {
  background-color: #212529;
}



.custom-navbar a {
  color: rgba(255,255,255,.75);
}



.custom-navbar a:hover,
.custom-navbar a:focus {
  color: rgba(255,255,255,1);
}



.container {
  max-width: 800px;
}





</style>
</head>

<body>
  <nav class="custom-navbar">
  <div class="container">
    
    <a href="/">文章</a>
    
    <a href="/tags/">标签</a>
    
    <a href="/about/">关于</a>
    
    <a href="/index.xml">RSS</a>
    
  </div>
</nav>
  
  <div class="container">
    <article>
      <h1>Go Crontab v3</h1>
<p>[TOC]</p>
<hr>
<h2 id="关于cron更新">关于cron更新</h2>
<h3 id="cron-v3已经发布">Cron V3已经发布！</h3>
<p>要下载特定的标记版本，请运行:</p>
<p><code>go get github.com/robfig/cron/v3@v3.0.0</code>
将其导入您的程序中:</p>
<p><code>import &quot;github.com/robfig/cron/v3&quot;</code>
由于Go Modules的使用，它需要Go 1.11或更高版本。</p>
<p>请参阅此处的文档：http://godoc.org/github.com/robfig/cron</p>
<p>本文档的其余部分介绍了v3的进展以及希望从早期版本升级的用户的重大更改列表。</p>
<p>升级到v3(2019年6月)
cron v3是对库的重大升级，可以解决所有未解决的错误，功能请求和粗糙边缘。它基于master的合并，其中包含对多年来发现的问题的各种修复，以及v2分支，其中包含一些向后兼容的功能，例如删除cron作业的功能。此外，v3增加了对Go Modules的支持，清除了时区支持等粗糙边缘，并修复了许多错误。</p>
<h3 id="新功能">新功能:</h3>
<p><strong>支持Go模块。调用者现在必须导入此库 github.com/robfig/cron/v3，而不是gopkg.in/&hellip;</strong></p>
<p>修正了错误:</p>
<p>0f01e6b 解析器: 修复Dow和Dom的组合(＃70)
dbf3220 在向前滚动时钟时调整时间以处理不存在的午夜(＃157)
eeecf15 spec_test.go：确保在0增量处返回错误(＃144)
70971dc cron.Entries(): 更新快照请求以包含回复通道(＃97)
1cba5e6 cron：修复: 删除作业导致下一个预定作业运行得太晚(＃206)
标准cron规范默认解析(第一个字段是“分钟”)，可以轻松选择进入秒字段(石英兼容)。虽然，请注意不支持年份字段(Quartz中的可选)。</p>
<p>通过符合https://github.com/go-logr/logr项目的接口进行可扩展的键/值记录。</p>
<p>新的Chain＆JobWrapper类型允许您安装“拦截器”以添加如下所示的横切行为:</p>
<p>从工作中恢复任何恐慌
如果先前的运行尚未完成，则延迟作业的执行
如果先前的运行尚未完成，则跳过作业的执行
记录每个作业的调用
作业完成时的通知
它向后与v1和v2不兼容。这些更新是必需的:</p>
<p><strong>v1分支在cron规范的开头接受了一个可选的秒字段。这是非标准的，并导致了很多混乱。新的默认解析器符合Cron维基百科页面所描述的标准。</strong></p>
<p>更新: 要保留旧行为，请使用自定义解析器构建您的Cron：</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-go" data-lang="go"><span style="display:flex;"><span><span style="color:#75715e">// Seconds field, required
</span></span></span><span style="display:flex;"><span><span style="color:#75715e"></span><span style="color:#a6e22e">cron</span>.<span style="color:#a6e22e">New</span>(<span style="color:#a6e22e">cron</span>.<span style="color:#a6e22e">WithSeconds</span>())
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#75715e">// Seconds field, optional
</span></span></span><span style="display:flex;"><span><span style="color:#75715e"></span><span style="color:#a6e22e">cron</span>.<span style="color:#a6e22e">New</span>(
</span></span><span style="display:flex;"><span>    <span style="color:#a6e22e">cron</span>.<span style="color:#a6e22e">WithParser</span>(
</span></span><span style="display:flex;"><span>        <span style="color:#a6e22e">cron</span>.<span style="color:#a6e22e">SecondOptional</span> | <span style="color:#a6e22e">cron</span>.<span style="color:#a6e22e">Minute</span> | <span style="color:#a6e22e">cron</span>.<span style="color:#a6e22e">Hour</span> | <span style="color:#a6e22e">cron</span>.<span style="color:#a6e22e">Dom</span> | <span style="color:#a6e22e">cron</span>.<span style="color:#a6e22e">Month</span> | <span style="color:#a6e22e">cron</span>.<span style="color:#a6e22e">Dow</span> | <span style="color:#a6e22e">cron</span>.<span style="color:#a6e22e">Descriptor</span>))
</span></span></code></pre></div><p>最常见的改造是添加秒，v3为我们提供了内置的方法实现：</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-go" data-lang="go"><span style="display:flex;"><span>	<span style="color:#a6e22e">c</span> <span style="color:#f92672">:=</span> <span style="color:#a6e22e">cron</span>.<span style="color:#a6e22e">New</span>(<span style="color:#a6e22e">cron</span>.<span style="color:#a6e22e">WithSeconds</span>())
</span></span><span style="display:flex;"><span>	<span style="color:#75715e">// 此处space 多了一个 seconds 的解析符
</span></span></span><span style="display:flex;"><span><span style="color:#75715e"></span>	<span style="color:#a6e22e">space</span> <span style="color:#f92672">:=</span> <span style="color:#e6db74">&#34;*/1 * * * * *&#34;</span>
</span></span><span style="display:flex;"><span>	<span style="color:#a6e22e">c</span>.<span style="color:#a6e22e">AddFunc</span>(<span style="color:#a6e22e">space</span>, <span style="color:#66d9ef">func</span>() {
</span></span><span style="display:flex;"><span>		<span style="color:#a6e22e">fmt</span>.<span style="color:#a6e22e">Println</span>(<span style="color:#e6db74">&#34;Every seconds action&#34;</span>)
</span></span><span style="display:flex;"><span>	})
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>	<span style="color:#a6e22e">c</span>.<span style="color:#a6e22e">Start</span>()
</span></span><span style="display:flex;"><span>	<span style="color:#66d9ef">select</span> {}
</span></span></code></pre></div><p>Cron类型现在接受构造上的功能选项而不是先前的特殊行为修改机制(设置字段，调用setter)。</p>
<p>更新: 必须更新设置Cron.ErrorLogger或调用Cron.SetLocation的代码以在构造时提供这些值。</p>
<p><strong>CRON_TZ现在是指定单个计划的时区的推荐方法，该计划由规范批准。遗留的“TZ =”前缀将继续得到支持，因为它是明确且易于执行的。</strong></p>
<p>更新: 无需更新。</p>
<p>**默认情况下，cron将不再恢复其运行的作业中的恐慌。**恢复可能会令人惊讶(参见问题＃192)，似乎与图书馆的典型行为不一致。相关地，该cron.WithPanicLogger选项已被删除以适应更通用的JobWrapper类型。</p>
<p>更新: 选择进行恐慌恢复并配置恐慌记录器:</p>
<p>cron.New(cron.WithChain(
cron.Recover(logger),  // or use cron.DefaultLogger
))
在添加对https://github.com/go-logr/logr的支持时，cron.WithVerboseLogger已删除，因为它与级别日志记录重复。</p>
<p>更新: 调用者应使用WithLogger并指定不丢弃Info日志的记录器。为方便起见，提供了一个包装*log.Logger：</p>
<p>cron.New(
cron.WithLogger(cron.VerbosePrintfLogger(logger)))</p>
<h3 id="背景---cron-spec格式">背景 - Cron spec格式</h3>
<p>**常用的有两种cron规范格式: **</p>
<p><strong>“标准”cron格式，在Cron维基百科页面上描述，由cron Linux系统实用程序使用。</strong> 格式为5位，没有秒级</p>
<p><strong>Quartz Scheduler使用的cron格式，通常用于Java软件中的预定作业</strong></p>
<p><code>CronExpression cexp = new CronExpression(&quot;0/5 * * * * ?&quot;);</code> Quartz格式为6位，和v1版本一样。</p>
<p>该软件包的原始版本包含一个可选的“秒”字段，这使得它与这两种格式都不兼容。现在，“标准”格式是接受的默认格式，Quartz格式是选择加入的。</p>

    </article>
  </div>

  
  
  

  
</body>

</html>